<html>
    <head>
        <title>创建第二个DbContext</title>
    </head>
    <body>
        <script>
            /*
                 2、创建第二个DbContext

                                                在运行时定义上面解释的连接字符串就足够了.  
                                                
                                                但是，BookStore_SecondDb数据库还不存在。你需要为相关模块创建数据库和表。

                                                就像主数据库一样，我们希望使用EF Core Code First迁移系统来创建和维护第二个数据库。

                                                因此，在.EntityFrameworkCore项目创建DbContext类：

                                                        using Microsoft.EntityFrameworkCore;
                                                        using Volo.Abp.AuditLogging.EntityFrameworkCore;
                                                        using Volo.Abp.Data;
                                                        using Volo.Abp.EntityFrameworkCore;
                                                        using Volo.Abp.PermissionManagement.EntityFrameworkCore;
                                                        using Volo.Abp.SettingManagement.EntityFrameworkCore;

                                                        namespace BookStore.EntityFrameworkCore
                                                        {
                                                            [ConnectionStringName("AbpPermissionManagement")]  // 设置连接字符串
                                                            public class BookStoreSecondDbContext :
                                                                AbpDbContext<BookStoreSecondDbContext>
                                                            {
                                                                public BookStoreSecondDbContext(
                                                                    DbContextOptions<BookStoreSecondDbContext> options)
                                                                    : base(options)
                                                                {
                                                                }

                                                                protected override void OnModelCreating(ModelBuilder builder)
                                                                {
                                                                    base.OnModelCreating(builder);

                                                                    // 将依赖模块的DbContext配置到当前DbContext中
                                                                    builder.ConfigurePermissionManagement();
                                                                    builder.ConfigureSettingManagement();
                                                                    builder.ConfigureAuditLogging();
                                                                }
                                                            }
                                                        }

                                                注解： [ConnectionStringName(...)]特性在这里很重要，它告诉ABP应该为此DbContext使用哪个连接字符串。
                                                        
                                                       我们已经使用了AbpPermissionManagement，但都是一样的。

                                                我们需要将这个BookStoreSecondDbContext类注册到依赖注入系统中。

                                                在BookStore.EntityFrameworkCore项目中打开BookStoreEntityFrameworkCoreModule类，并将以下行添加到ConfigureServices方法中：

                                                        context.Services.AddAbpDbContext<BookStoreSecondDbContext>();


                                                我们还应该创建一个Design Time Db Factory类，由EF Core工具使用（例如，通过Add-Migration和Update-DatabasePCM命令）：

                                                        using System.IO;
                                                        using Microsoft.EntityFrameworkCore;
                                                        using Microsoft.EntityFrameworkCore.Design;
                                                        using Microsoft.Extensions.Configuration;

                                                        namespace BookStore.EntityFrameworkCore
                                                        {
                                                            // This class is needed for EF Core console commands
                                                            // (like Add-Migration and Update-Database commands) 
                                                            public class BookStoreSecondDbContextFactory
                                                                : IDesignTimeDbContextFactory<BookStoreSecondDbContext>
                                                            {
                                                                public BookStoreSecondDbContext CreateDbContext(string[] args)
                                                                {
                                                                    var configuration = BuildConfiguration();
                                                                    var builder = new DbContextOptionsBuilder<BookStoreSecondDbContext>()
                                                                        .UseSqlServer(configuration.GetConnectionString("AbpPermissionManagement"));
                                                                    return new BookStoreSecondDbContext(builder.Options);
                                                                }

                                                                private static IConfigurationRoot BuildConfiguration()
                                                                {
                                                                    var builder = new ConfigurationBuilder()
                                                                        .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../BookStore.DbMigrator/"))
                                                                        .AddJsonFile("appsettings.json", optional: false);

                                                                    return builder.Build();
                                                                }
                                                            }
                                                        }

                                                现在，你可以打开包管理器控制台，选择.EntityFrameworkCore项目作为默认项目（确保.Web项目仍然是启动项目）并运行以下命令：

                                                        " Add-Migration "Initial" -OutputDir "SecondDbMigrations" -Context BookStoreSecondDbContext "

                                                这将在.EntityFrameworkCore项目中添加一个 "SecondDbMigrations文件夹" 和其中的迁移类。

                                                OutputDir和Context参数是必需的，因为我们目前在同一个项目中有两个DbContext类和两个迁移文件夹。

                                                你现在可以运行以下命令来创建数据库及其中的表：

                                                        "Update-Database -Context BookStoreSecondDbContext"

                                                应该创建一个名为 " BookStore_SecondDb " 的新数据库。
            */
        </script>
    </body>
</html>